package picol.model.asa.expr;

/**
 * Classe de gestion de l'expression de modulo
 * @author Aurélien Marcel - Julien Sanderson
 */
public class ASAExprMod extends ASAExpr {

    private ASAExpr expr1;
    private ASAExpr expr2;

    public ASAExprMod(ASAExpr _expr1, ASAExpr _expr2) {
        this.expr1 = _expr1;
        this.expr2 = _expr2;
    }

    @Override
    public ASAExpr getExpr1() {
        return expr1;
    }

    @Override
    public ASAExpr getExpr2() {
        return expr2;
    }

    public String getLabelExplorateur() {
        return "MOD";
    }

    @Override
    public int evalue() {

        int modulo = 0;

        if ((modulo = expr2.evalue()) != 0) {
            return expr1.evalue() % modulo;
        } else {
            // renvoie une exception si l'utilisateur tente une division par zéro
            throw new RuntimeException("Division by zero not allowed");
        }
    }

    @Override
    public ASAExpr simplifie() {

        ASAExpr se1 = expr1.simplifie();
        ASAExpr se2 = expr2.simplifie();

        if (se1 instanceof ASAExprEntier && se2 instanceof ASAExprEntier) {
            return new ASAExprEntier(se1.evalue() % se2.evalue());
        }

        if (se2.getValeur() == 1) {
            return null;
        }

        if (se1.getValeur() == 0) {
            return null;
        }

        if (se2.getValeur() == se1.getValeur()) {
            return null;
        }

        return new ASAExprMod(se1, se2);
    }
}
